﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TaxiCaosWeb.Models;
using System.ServiceModel;
using System.Messaging;

namespace TaxiCaosWeb.Controllers
{
    public class ClienteController : Controller
    {

        private Cliente ObtenerCliente(int IdCliente)
        {
            List<Cliente> Clientes = (List<Cliente>)Session["Clientes"];
            Cliente model = Clientes.Single(delegate(Cliente cliente)
            {
                if (cliente.IdCliente == IdCliente) return true;
                else return false;
            });
            return model;
        }

        //
        // GET: /Cliente/Crear
        public ActionResult CrearCliente()
        {
            ViewData["TiposClientes"] = new SelectList(retornarListaTipoClienteWS(), "IdCatalogo", "Descripcion");
            ViewData["TiposDocumentos"] = new SelectList(retornarListaTipoDocumentoWS(), "IdCatalogo", "Descripcion");

            return View();
        }

        //
        // GET: /Cliente/CrearCliente
        [HttpPost]
        public ActionResult CrearCliente(Cliente cliente)
        {
            ClientesWS.ClientesClient proxy = new ClientesWS.ClientesClient();

            string mensaje = "";
            string tipoMensaje = "";

            try
            {
                ClientesWS.Cliente cliente_ = new ClientesWS.Cliente();

                cliente_.Apellidos = cliente.Apellidos;
                cliente_.Nombres = cliente.Nombres;
                cliente_.RazonSocial = cliente.RazonSocial;
                cliente_.TipoDocumento = cliente.TipoDocumento;
                cliente_.NumeroDocumento = cliente.NumeroDocumento;
                cliente_.Email = cliente.Email;
                cliente_.Direccion = cliente.Direccion;
                cliente_.Telefono = cliente.Telefono;
                cliente_.FecNacimiento = cliente.FecNacimiento;
                cliente_.TipoCliente = cliente.TipoCliente;

                proxy.CrearCliente(cliente.ULogin, cliente.Password, cliente_);

                mensaje = "Los datos se grabaron satisfactoriamente";
                tipoMensaje = "INFO";
            }
            catch (FaultException<ClientesWS.ClienteException> ex)
            {
                mensaje = ex.Message;
                tipoMensaje = "WARN";

                ViewData["TiposClientes"] = new SelectList(retornarListaTipoClienteWS(), "IdCatalogo", "Descripcion");
                ViewData["TiposDocumentos"] = new SelectList(retornarListaTipoDocumentoWS(), "IdCatalogo", "Descripcion");
              
            }

            catch (Exception ex)
            {
                string resultadocola = ColaClienteRegistraPost(cliente);

                if (resultadocola == "OK")
                {
                    mensaje = "En estos momentos no se puede registrar sus datos pues el servicio no se encuentra disponible, apenas se restablezca se le confirmará el registro. Por favor realizar por el momento una reserva libre";
                    tipoMensaje = "INFO";
                }
                else {
                    mensaje = ex.Message;
                    tipoMensaje = "WARN";
                }

            }

            return (Json(new { mensaje = mensaje, tipoMensaje = tipoMensaje, redirectTo = Url.Action("Index","Home") }, JsonRequestBehavior.DenyGet));

        }


        //Metodos Utilitarios
        private List<Catalogo> retornarListaTipoDocumentoWS()
        {
            CatalogosWS.CatalogosClient proxy = new CatalogosWS.CatalogosClient();

            IList<CatalogosWS.Catalogo> lista = proxy.ObtenerListaPorTipoCatalogo("TIPDOC");

            List<Catalogo> listaTipoDoc = new List<Catalogo>();
            Catalogo tipodoc;
            foreach (CatalogosWS.Catalogo tipodocWS in lista)
            {
                tipodoc = new Catalogo();
                tipodoc.IdCatalogo = tipodocWS.Codigo;
                tipodoc.Descripcion = tipodocWS.Descripcion;
                listaTipoDoc.Add(tipodoc);
            }
            return listaTipoDoc;
        }

        private List<Catalogo> retornarListaTipoClienteWS()
        {
            CatalogosWS.CatalogosClient proxy = new CatalogosWS.CatalogosClient();

            IList<CatalogosWS.Catalogo> lista = proxy.ObtenerListaPorTipoCatalogo("TIPCLI");

            List<Catalogo> listaTipoCliente = new List<Catalogo>();
            Catalogo tipodoc;
            foreach (CatalogosWS.Catalogo tipodocWS in lista)
            {
                tipodoc = new Catalogo();
                tipodoc.IdCatalogo = tipodocWS.Codigo;
                tipodoc.Descripcion = tipodocWS.Descripcion;
                listaTipoCliente.Add(tipodoc);
            }
            return listaTipoCliente;
        }

        public String ColaClienteRegistraPost(Cliente _clienteACrearCola)
        {

            String rep;

            try
            {
                // 1. Enviamos los datos de las clientes (In)
                string rutaColaIn = @".\private$\clientes";
                if (!MessageQueue.Exists(rutaColaIn))
                    MessageQueue.Create(rutaColaIn);
                MessageQueue colaIn = new MessageQueue(rutaColaIn);
                Message mensajeIn = new Message();
                mensajeIn.Label = "ColaClientes";
                Dominio.Cliente clienteCola = new Dominio.Cliente
                {
                    Apellidos = _clienteACrearCola.Apellidos,
                    Nombres = _clienteACrearCola.Nombres,
                    RazonSocial = _clienteACrearCola.RazonSocial                    ,
                    TipoDocumento = _clienteACrearCola.TipoDocumento,
                    NumeroDocumento = _clienteACrearCola.NumeroDocumento
                    ,
                    Email = _clienteACrearCola.Email,
                    Direccion = _clienteACrearCola.Direccion,
                    Telefono = _clienteACrearCola.Telefono
                    ,
                    FecNacimiento = _clienteACrearCola.FecNacimiento,
                    TipoCliente = _clienteACrearCola.TipoCliente,
                    ULogin = _clienteACrearCola.ULogin,
                    Password = _clienteACrearCola.Password

                };

                mensajeIn.Body = clienteCola;

                colaIn.Send(mensajeIn);
                rep = "OK";
            }
            catch
            {
                rep = "ERROR";
            }

            return rep;
        }

    }
}
